/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package bibliOnline.db;

import bibliOnline.util.details.BookData;
import bibliOnline.util.details.UserDetails;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Types;
import java.util.ArrayList;

/**
 *
 * @author Gabri
 */
public class ReservationManager {

    public static int addReservation(UserDetails user, String id) throws Exception {

        // Controllo se l'utente è registrato
        if (user == null) {
            throw new Exception("Per poter prenotare occorre essere registrati!");
        }

        System.out.println("L'utente " + user.getUsername() + " vuole prenotare il libro " + id);
        
        // Stored procedure che ritorna il tempo di attesa
        String sql = "VALUES(GET_WAITING_TIME(" + id + "))";
        //int id_int = Integer.parseInt(id);
        
        PreparedStatement ps = DBConnection.prepareStatement(sql);
        ResultSet rs = ps.executeQuery();
        rs.next();
        int remainingTime = rs.getInt(1);

        PreparedStatement statement;
        int book_counter = 0;

        // Controllo se non ha già prenotato quel libro, e se i libri prenotati non sono al massimo
        sql = "select book_id from booking where username=?";

        statement = DBConnection.prepareStatement(sql);
        statement.setString(1, user.getUsername());
        rs = statement.executeQuery();

        while (rs.next()) {
            if (rs.getInt("book_id") == (Integer.parseInt(id))) {
                throw new Exception("Hai già prenotato questo libro");
            }
            ++book_counter;
        }
        
        if (book_counter >= Integer.parseInt(DBConnection.getProperty("MAX_RESERVED_BOOKS"))) {
            throw new Exception("Hai già prenotato il numero massimo di libri che ti è consentito");
        }

        rs.close();
        statement.close();

        sql = "insert into booking (username, book_id) values (?, ?)";

        statement = DBConnection.prepareStatement(sql);
        statement.setString(1, user.getUsername());
        statement.setString(2, id);
        statement.executeUpdate();
        statement.close();
        
        return remainingTime;
    }

    public static ArrayList<BookData> loadReservations(UserDetails user) throws Exception {
        // Controllo se l'utente è registrato
        if (user == null) {
            throw new Exception("Per poter prenotare occorre essere registrati!");
        }

        PreparedStatement pst;
        ResultSet rs;
        ArrayList<BookData> bookList = new ArrayList(2);
        String sql = "select book.book_id, title, author, publisher, edition, genre, year, state"
                + " from booking, book where booking.BOOK_ID = book.BOOK_ID and username=?";

        pst = DBConnection.prepareStatement(sql);
        pst.setString(1, user.getUsername());
        rs = pst.executeQuery();

        // Aggiungo la lista dei libri trovati
        while (rs.next()) {
            bookList.add(new BookData(
                    rs.getInt("book_id"),
                    rs.getString("title"),
                    rs.getString("author"),
                    rs.getString("publisher"),
                    rs.getString("edition"),
                    rs.getString("genre"),
                    rs.getInt("year"),
                    rs.getString("state"),
                    0,"","")); //TODO
        }

        return bookList;
    }

    /**
     * Contatta il db e rimuove la prenotazione del libro corrispondente
     */
    public static void removeReservation(UserDetails user, String id) throws Exception {
        // Controllo se l'utente è registrato
        if (user == null) {
            throw new Exception("Per poter rimuovere le prenotazioni occorre essere registrati!");
        }

        System.out.println("L'utente " + user.getUsername() + " vuole rimuovere la prenotazione per il libro " + id);

        PreparedStatement statement;
        String sql = "delete from booking where username=? and book_id=?";

        statement = DBConnection.prepareStatement(sql);
        statement.setString(1, user.getUsername());
        statement.setString(2, id);
        statement.executeUpdate();
        statement.close();
    }
}
